package middleware

import (
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/inntu/backend/utils/jwt"
)

// JWT 中间件，用于验证请求中的令牌
func JWT() gin.HandlerFunc {
	return func(c *gin.Context) {
		var token string
		// 从Authorization头获取令牌
		auth := c.GetHeader("Authorization")
		if auth != "" {
			parts := strings.SplitN(auth, " ", 2)
			if len(parts) == 2 && parts[0] == "Bearer" {
				token = parts[1]
			}
		}

		// 如果没有令牌，返回未授权错误
		if token == "" {
			c.JSON(http.StatusUnauthorized, gin.H{
				"code":    401,
				"message": "未授权，请先登录",
			})
			c.Abort()
			return
		}

		// 解析令牌
		claims, err := jwt.ParseToken(token)
		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{
				"code":    401,
				"message": "令牌无效或已过期",
			})
			c.Abort()
			return
		}

		// 将用户信息存储到上下文中
		c.Set("user_id", claims.UserID)
		c.Set("username", claims.Username)
		c.Set("role", claims.Role)

		c.Next()
	}
}

// OptionalJWT 可选的JWT中间件，用于区分管理端和小程序端
// 如果有token则验证，没有token则跳过（适用于小程序端）
func OptionalJWT() gin.HandlerFunc {
	return func(c *gin.Context) {
		var token string
		// 从Authorization头获取令牌
		auth := c.GetHeader("Authorization")
		if auth != "" {
			parts := strings.SplitN(auth, " ", 2)
			if len(parts) == 2 && parts[0] == "Bearer" {
				token = parts[1]
			}
		}

		// 如果有令牌，则验证令牌
		if token != "" {
			claims, err := jwt.ParseToken(token)
			if err != nil {
				// 令牌无效，但不阻止请求继续
				c.Set("auth_error", "令牌无效或已过期")
			} else {
				// 令牌有效，存储用户信息
				c.Set("user_id", claims.UserID)
				c.Set("username", claims.Username)
				c.Set("role", claims.Role)
				c.Set("authenticated", true)
			}
		} else {
			// 没有令牌，标记为未认证但允许继续
			c.Set("authenticated", false)
		}

		c.Next()
	}
}